<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /*
            题目：有效的括号
            这个 str 参数，只包含 '(', ')', '{', '}', '[' 和 ']' 这 6 个组成的字符。
            判断这个字符串是否是有效的括号字符串。
        */
      function f(str) {
        if (str.length % 2 !== 0) return false;
        const stack = []; // 栈-先进后出
        // * 最开始的写法
        // for (let i = 0; i < str.length; i++) {
        //   if (str[i] === "(" || str[i] === "{" || str[i] === "[") {
        //     stack.push(str[i]);
        //   } else if (str[i] === ")" || str[i] === "}" || str[i] === "]") {
        //     const top = stack.at(-1);
        //     if (top === "(" && str[i] === ")") {
        //       stack.pop();
        //     } else if (top === "{" && str[i] === "}") {
        //       stack.pop();
        //     } else if (top === "[" && str[i] === "]") {
        //       stack.pop();
        //     }
        //   }
        // }
        // return stack.length === 0;

        const map = new Map([
          [")", "("],
          ["]", "["],
          ["}", "{"],
        ]);

        for (const s of str) {
          if (map.has(s)) {
            const top = stack.at(-1);
            if (top !== map.get(s)) {
              return false;
            }
            stack.pop();
          } else {
            stack.push(s);
          }
        }
        return stack.length === 0;
      }

      console.log(f("({[]})"));
    </script>
  </body>
</html>
